home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
pctj8311.arc
/
INBASIC3.BAS
< prev
next >
Wrap
BASIC Source File
|
1984-01-25
|
3KB
|
61 lines
10 DEFINT A-Z : DEF SEG
20 ' the BASIC statement will go into the next line
30 DEF FNF(X)=||' '
40 ' setup keyword list
50 DIM K$[10],K[10]
60 FOR I=1 TO 10 : READ K$[I],K[I] : NEXT
70 DATA SGN,132,ABS,134,INT,133,SQR,135,EXP,139,LOG,138
80 DATA SIN,137,COS,140,TAN,141,ATN,142
90 ' get string, loop thru characters
100 INPUT "ENTER YOUR FUNCTION: ";E$ : L=LEN(E$) : X$=""
110 FOR I=1 TO L : C$=MID$(E$,I,1) : A=ASC(C$)
120 IF C$="(" OR C$=")" THEN X$=X$+C$ : GOTO 540 ' copy parentheses
130 ' is it an arithmetic operator?
140 P=INSTR("+-*/^",C$)
150 IF P>0 THEN X$=X$+CHR$(232+P) : GOTO 540
160 IF C$="\" THEN X$=X$+CHR$(244) : GOTO 540
170 ' is it a name?
180 IF A<65 OR A>90 THEN 290 ' letter?
190 N$=C$
200 FOR J=1 TO LEN(E$)-I : C$=MID$(E$,I+J,1) : A=ASC(C$)
210 IF NOT (A>64 AND A<91) OR (A>47 AND A<58) OR C$="." THEN 230 'end of name?
220 N$=N$+C$ : NEXT
230 I=I+J-1
240 ' is it a keyword?
250 FOR J=1 TO 10
260 IF N$=K$[J] THEN X$=X$+CHR$(255)+CHR$(K[J]) : GOTO 540 ' prefix, keyword
270 NEXT
280 X$=X$+N$ : GOTO 540
290 ' is it a number?
300 IF (A>47 AND A<58) OR C$="." THEN 320 ' digit or point?
310 PRINT "INVALID EXPRESSION: "+E$ : STOP
320 ' get the entire number
330 N$=C$
340 FOR J=1 TO LEN(E$)-I : C$=MID$(E$,I+J,1) : A=ASC(C$)
350 IF NOT (A>47 AND A<58) OR C$="." THEN 370 ' end of number?
360 N$=N$+C$ : NEXT
370 I=I+J-1
380 ' is it well-formed?
390 N#=VAL(N$) : IF 0<>N# OR N$="0" THEN 410
400 PRINT "INVALID EXPRESSION: "+E$ : STOP
410 ' convert to proper form
420 IF N#<>INT(N#) THEN 480 ELSE N=VAL(N$) ' integer or decimal number?
430 ' integers
440 IF 1=LEN(N$) THEN X$=X$+CHR$(N+17) : GOTO 540 ' single decimal digit
450 IF N>=0 AND N<256 THEN X$=X$+CHR$(15)+CHR$(N) : GOTO 540 ' single byte
460 IF ABS(N)>32768! THEN 480 ELSE A=VARPTR(N)
470 X$=X$+CHR$(28)+CHR$(PEEK(A))+CHR$(PEEK(A+1)) : GOTO 540 ' two bytes
480 ' floating point
490 N!=VAL(N$)
500 ' single precision if less than 7 digits, double otherwise
510 IF LEN(N$)>8 THEN A=VARPTR(N#) : C=8 ELSE A=VARPTR(N!) : C=4
520 IF C=4 THEN X$=X$+CHR$(29) ELSE X$=X$+CHR$(31) ' floating point prefixes
530 FOR J=0 TO C-1 : X$=X$+CHR$(PEEK(A+J)) : NEXT
540 NEXT I
550 ' find the place to put the expression
560 A=PEEK(&H30)+256*PEEK(&H31) ' start of program text
570 FOR I=A TO 32767
580 IF 124=PEEK(I) AND 124=PEEK(I+1) THEN 600 ELSE NEXT ' find ||
590 STOP
600 FOR J=1 TO LEN(X$) : POKE I+J-1,ASC(MID$(X$,J,1)) : NEXT ' store statement